{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\IRIDES~1\\AppData\\Local\\Temp\\jieba.cache\n",
      "Loading model cost 2.353 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    }
   ],
   "source": [
    "# from spider import TextSpider_urllib\n",
    "import urllib.request as urllib2\n",
    "from text_former import TextFormer, CleanedText\n",
    "import matplotlib.pyplot as plt\n",
    "from bs4 import BeautifulSoup\n",
    "from typing import List\n",
    "from tqdm import tqdm\n",
    "import seaborn as sns\n",
    "import numpy as np\n",
    "import pandas\n",
    "import time\n",
    "import sys\n",
    "import re\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('./input_data/artists.txt', 'r', encoding='utf-8') as f:\n",
    "    artists = f.readlines()\n",
    "    artists = [i.strip(' \\n').split(' ')[0] for i in artists]\n",
    "with open('./input_data/repertory.txt', 'r', encoding='utf-8') as f:\n",
    "    repertory = f.readlines()\n",
    "    repertory = [i.strip(' \\n').split(' ')[0] for i in repertory]\n",
    "with open('./input_data/cliques.txt', 'r', encoding='utf-8') as f:\n",
    "    cliques = f.readlines()\n",
    "    cliques = [i.strip(' \\n').split(' ')[0] for i in cliques]\n",
    "with open('./input_data/vocations.txt', 'r', encoding='utf-8') as f:\n",
    "    vocations = f.readlines()\n",
    "    vocations = [i.strip(' \\n').split(' ')[0] for i in vocations]\n",
    "\n",
    "key_words = { 'artists':artists, 'repertory':repertory, 'cliques':cliques, 'vocations':vocations }\n",
    "\n",
    "paths = {\n",
    "    'artist_info':'./input_data/BaiduBaike/artists_info.csv', \n",
    "    'repertory_info':'./input_data/BaiduBaike/repertory_info.csv',\n",
    "    'bilibili_comment':'./input_data/Bilibili/jingju_comment.csv'\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['rpid', 'oid', 'type', 'mid', 'count', 'ctime', 'like', 'uname', 'sex',\n",
       "       'current_level', 'vipType', 'vipStatus', 'message', 'has_folded',\n",
       "       'is_folded'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cmt_df = pandas.read_csv(paths['bilibili_comment'])\n",
    "cmt_df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "cmt_df = cmt_df[['oid', 'ctime', 'like', 'uname', 'sex', 'message']]\n",
    "cmt_df_by_oid = dict(tuple(cmt_df.groupby('oid')))\n",
    "cmt_df_by_uname = dict(tuple(cmt_df.groupby('uname')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "data1 = [' '.join(list(i['message'])) for i in cmt_df_by_oid.values()]\n",
    "data2 = [' '.join(list(i['message'])) for i in cmt_df_by_uname.values()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 23527/23527 [01:20<00:00, 292.41it/s]\n"
     ]
    }
   ],
   "source": [
    "ret = [CleanedText(i) for i in tqdm(data2)]\n",
    "clean_texts, tagged_words = tuple(zip(*ret))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(23527, 22631)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vectorizer = TfidfVectorizer()\n",
    "X = vectorizer.fit_transform(clean_texts)\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "TruncatedSVD(n_components=8, n_iter=100, random_state=2022)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.decomposition import TruncatedSVD\n",
    "svd_model = TruncatedSVD(n_components=8, n_iter=100, random_state=2022)\n",
    "svd_model.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Topic 0: \n",
      "好听  系列  热词  真的  喜欢  京剧  知识  \n",
      "Topic 1: \n",
      "系列  热词  增加  知识  离谱  哈哈哈  好家伙  \n",
      "Topic 2: \n",
      "哈哈哈  哈哈哈哈  离谱  越来越  可爱  喜欢  京剧  \n",
      "Topic 3: \n",
      "离谱  越来越  眼睛  藏狐  喜极而泣  版本  厉害  \n",
      "Topic 4: \n",
      "喜欢  厉害  京剧  真的  文化  好好  眼睛  \n",
      "Topic 5: \n",
      "厉害  卧槽  支持  好听  大姨  哈哈哈哈  真的  \n",
      "Topic 6: \n",
      "眼睛  真的  卧槽  京剧  藏狐  文化  感觉  \n",
      "Topic 7: \n",
      "卧槽  哈哈哈哈  文化  京剧  藏狐  真的  输出  \n"
     ]
    }
   ],
   "source": [
    "terms = vectorizer.get_feature_names()\n",
    "for i, comp in enumerate(svd_model.components_):\n",
    "    terms_comp = zip(terms, comp)\n",
    "    sorted_terms = sorted(terms_comp, key=lambda x:x[1], reverse=True)[:7]\n",
    "    print(\"Topic \"+str(i)+\": \")\n",
    "    for t in sorted_terms:\n",
    "        print(t[0], ' ', end='')\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAEvCAYAAADLvP+CAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO29f3BU15Xv+13dtHDDQIQmhon7WhGRGXzjEZbeUAFGNVOOJxjHunE63NgKA/PyZm7hSVXy6hE8epECCZABo4lizK268+ZVqDtVcwvsEdi4x4kwmFzHt+6jgESOBAqJeRiDZbf9wBOsQEBGQtrvj+4jTrfOj33O2edX9/pUqRDd6j67+5yz115rr/VdJIQAwzAMw8SRRNgDYBiGYRi3sBFjGIZhYgsbMYZhGCa2sBFjGIZhYgsbMYZhGCa2sBFjGIZhYsuMsAeg5+Mf/7hoaGgIexgMwzBMhHj99df/TQhxp9FzkTJiDQ0N6O/vD3sYDMMwTIQgorfNnuNwIsMwDBNb2IgxDMMwsYWNGMMwDBNb2IgxDMMwsYWNGMMwDBNb2IgxDMMwsYWNGMMwDBNbIlUnxjCVRG4gj54jZ/HeyCjuqk2jY9ViZFsyYQ+LYSoK9sQYxgdyA3ls6B1EfmQUAkB+ZBQbegfR0NkX9tAYpqJgI8YwPrChd9D0uYbOPqzdczzA0TBM5cLhRIYJgWPnr2BhZx+eaW+OVIjRyFNcMKcGJzetDGE0DGMPe2IMExICBY9t5a7Xwh4KAGMDBgCXro1xGJSJLGzEGCZkzl2+jnu6wjUSMkZqyZbDAYyEYZzBRoxhfGAGOfv7WwJYtuOoP4NRxNWbE2EPgWGmwXtiDOMDb+5sw8LOPggHr7l0bQz//jsvY+fqJYHtk63c9RrOXb7u6rVaBqaeuTOTOL3tYRVDYxgpSAgnt5m/LF26VHA/MaaSMJroZbnY3aZ4NKV4MWDrltdj74lhw+fYkDGqIaLXhRBLjZ7jcCLD+Ei2JePaGDV09mFzbkjxiG7j1oABMDVgAIcdmWBhI8YwEWbviWHfjRnDxBk2YgwTAAmHiR7l7D0xjIWc5s4w02AjxjAB8BfL6j2/h4DaEOOi+bOVvE85c2cmfXlfhjGCjRjDBMD2bBPWLa9HkgouWZII65bXY8GcGsfvpYUYvXJ04wO+GLKrNyfQ0NnHBdJMIHB2IsOEzOLNL+PmrUnXr1eZxbg5N4R9J4alSgPWLa/H9myTbQam31mWTOVjlZ3IRoxhQiY3kMfG3kG4N2P+6xtuzg3huZPvYEIIJImwZtnd2J5tAgC0dr+K/Mio1PvMnJHA3//H4OrgmMqAU+wZJsJkWzLY1d7s6T00fcPcQF7RqOR5T9KAAcDNW5PYuH8wlHEylQkbMYaJANmWDDK1ac/vo/Usu3fTIQWjKrA5N4S9J4YxUYzaTAiBvSeGpxJM7nI47kkB9Bw5q2x8THXj2YgR0WIiGtT9XCWiDUS0lYjyuscfUTFghqlUOlYtRjqlJrPvownhOSX/3k2H0NDZZ1rYvK/4+Kwa59OIE++NYazwrJ0ohDgLoBkAiCgJIA/gRQB/BeAZIcQPvB6DYVTjVHKpNp3C1kfv83UvR3vvniNnpfeYrBAoeFHa3pUduYG8o2MLAGv3HHel/OHUe5PBLBuSE0sqG6WJHUT0EIAtQohWItoK4HdOjBgndsSLZTuO4tK1sWmPtzbWYd/6FSGMyJzcQB5bXzqDkdFxZe/p5+d0Kh5shcwk7kXj0Q27FTcDtUvnX7e83jQxhYk+QSZ2fAXAc7r/f4OIThPRPxHRPMXHYkKkobPP0IABha7Fa/ccD3hExmj1Sht6B5UaMMDfz2llwC52t8GjAMg0Og4EZ8AABGrAAFju6THxRpkRI6IaAI8COFB86B8BNKIQanwfwNMmr3uCiPqJqP+DDz5QNRzGJzbnhqQmjWPnrwQwGmO0MQZRbHvs/JXAM+0WdvaBHFixhZ19aO1+1XKc4y7y+9ct965CEibPnXwn7CEwClDpiX0ewC+EEJcAQAhxSQgxIYSYBLAHwGeMXiSE+KEQYqkQYumdd96pcDiMarQsNVlW7nrNv8GYsNAiEcEvtIzAT3/n5UAMmkAhw8/J3+dHRtF1cEjJ+DS1ke3ZJrQ21rl6jyik2E9EqEaWcY9KI7YGulAiEX1C99yXAPxS4bGYEHBqHM5dvo7mba8EMmHlBvJoULiP5IYb45PY0DsYivGWYXR8Ysrgug2Drltej/M7H5naT9q3fsU0Q9baWGdr3KKQYu9VlJmJBko6OxPRLAArAfyN7uHvE1EzCgvBi2XPMVXCyOg4Og6cAqB2H0TPki2HI9XD6tzl62js6sPTj6tNXtCTTiUw6iYGWETbz9MSU1ob62xDwJr3VY5ZcotVODcKKfaTorD4YfWQeMOyU4w0XvaYMrVpHOt8UOFoCsRBZNZNJp5VCQABeKa92bNUFVCaubh2z/ESQ+Yl+/LeTYfw0YT53KL6evB6HUQxo5a5jVV2ohJPjGHsUL3yLp9wo8yG3kEc6B92NEke3fiAoSEjABd0hqfnyFm8NzKKu2rTaPj9tKfvROUkbmXAgEJht0oudrd5MmTHzl9BQ2cfG7MYwp4YI43d6toKlStvp4XKUcFPkV6zmj07vBYCG3lvMobUzwJkFd656jo2xhssAMwo4Y0d7pTDUglStvLenBuKpQEDCiK993SpD3+6NWBeMfKGZQyYCo1IK5JO6g9M2NA7GJlaR8YaNmKMI+xW0OXTR206hZ7H7leyql2y5XDg6fOquSUKRkclbg2YV2PiNnSpOpRYzppldyt5Hy3EGFZ3AEYO3hNjlHLBpzDRsh1HI5WB6IUgvaY7kmQYAk6nkr4bEyNmUCFLtTwkvGj+bBzd+ICSY2gZlEYyU5/+zsu44SKrc0PvIPrfvsJSVRGEjRgTaZwWWMcFJ8K8XtBCwJq4r5YE0rFqcSh7Pm/ubDPc0zx3+TpW7npNqSEz+n69lCXsPTE8dS1mQvwOmVLYiDGOmTszaegVzZ2ppo2IhkoR3Kix98QwLnzwu8Ay4bItmdAnXO36MNvT9LLXKevZ3VWbVtIhID8yOiWYHPb3Wu3wnhjjmNPbHp5msObOTOL0toeVHeOerso1YBrHzl+pKhHaR32a7K08u3JU9mwDEKjyP2MMe2KMK1QarHJyA3ncqnQLVmTvieFY7rO4kdZS8VmdpM8beXaa17TtR2fw4Q01XQ0aOvt8LZ9grGFPjIkc1ba6VZ2t6Bebc0No7Cp0e/YS+ls0f7ajxzVUqbNkWzIY+O5D2N3ejExtGoTCHtfu9mbX73np2lhszmOlwZ4YEymqcSIIo8bLKSoTbIzUSFRmJ8pitE+o/d+NIkwczmMlwkaMiQybc0M8EUQMv9RRgjBYdp6dFfvWr0Br96tKkkAYf+FwYpWRG8ijtftVqUaJQeNlpb+7vRkXu9twsbsN6VT8LusonQcN1QYsyM4nKjw71UkgjD+wJ1Yl5Aby0zaztUaJQLBpwkZ6e48t9dYluOfI2anPsHP1ktjtq23sHXR9DhbMqTH1YBd29rmuC1PtgQkArd2v+lpfZdYuxg3aGLsOnpaqL1swp0bJcRlnsBGrcOw2w0fHJ0oMgN+Y6e15VaTXq+Q7nXyigJtRGi1MytF3dQbCr2lyUl/lZl9q74lhLP1knbLPqe2b3ffdw7g+Zq4Yw9mJ4cFGrAJxmsUVZINCv9qn3FWmA1i+aZ8byGPrS2cwMlo64Seo0BwxbuQG8ug6OITRcTkprtHxCXQdPB26EdP4po3n6aXVzobeQWzoHVRau7jjS03Tvu90Komdq5si851WK/HbPGAscZOGXG4A4oaMDmC2JYPBLdPTqnc9XthLi1un+p4jZ6UNmMbo+KSj4moviRF22K0bVCx2rt6cwJIthz2/D1C4fnaubiq5dtiARQP2xKqcoIRgVdX41KZTGBkdR5IIE0I41rAzk196pr05VvtobrPmnjv5jvSekVEqfALuQp9hoVI0OgrSXcx02IhVOUGsJlUZMD8bFWrv+83ewVjIXRHsvRkjJhw2wTXK8ItTV22m8uFwYpUTl5Vlksj3sWZbMrhQTNNft9xbtqRTnKpFhGloVYgW22XyzZzBUxMjB3tiVUxrY13YQ5BGVaNDWbRWHkF4HeuW18dmMaGx20P4VSaTb+xWnIKWtzFSNglDjaSa4OVOhWHXeVmjtbEusDYgdmRq01OFykaGVWXtj1P2rV9hOTYVOP1sXqS5kqQmhcWJ0U0SoD/stY9u2RZ3q0o28qKH6BQzaa5zl69PdYiuRlk1v2FPrAKRNWRRoDyxJCqG1Yh961dMNZcMS47Ia481lR6trDdW3lj6xvikba1Yx6rF6DhwCuMe6h/83EMF3O31Xro2hobOPvbOFELC4UavnyxdulT09/eHPQzGB4xueD+6427ODU21pffzOKqSVQD5RYcqGagkEdYsu1uJd+vle6hNpzC45SHT581q+2TxczGn6vzPoEK3a8YaInpdCLHU6Dn2xJhACMI7NAvnaCoRG3oHY70CViUDNSHE1Pfk1ZCtW17vWvPSzjiVp7SrXDjYYbRg8OPauSUKn8tvr7GSYSPGVAzPnXzH9m+0jr9eJ6PZNUlLGSJZZLMg/ZjA954Yxk/f+MCTl7o924R9J4Z9yZb0klTjplDb7niqrh0jZKW4mOmwEWMqBtkaKBUezY4vNeHJA6cw4WHPZu7MpJQnJGvAWhvrHE/6ei+1HFnv+UJ3mysjO8ui24DXrNB3P5Tfs8wN5KUzLf1oS6OxwYMIdDWjJDuRiC4S0RARDRJRf/GxOiI6SkTniv/OU3EshjFDVeadDNmWDJ5+7H5kXGbR3ZEkZbp+QMGj27d+hdIMSieGyc1xZ1q0OfFa1mAl/Lw5N4SFxWzBhs6+SCm1qJLJqiZUpth/VgjRrNt86wTw34UQiwD89+L/GcY3gq4ly7ZkcKzzQcevmzsziTd2PKJsHIvmz57y6PQlAX5qH5azb/0KzHC4hhixUN/3C23f1Gv408xL9ZrSf/XmhCN9S8bfOrEvAvjn4u//DCDr47EYJrRastp0SvpvWxvrlHpggHmX5KMbHwjUkDnNsgtDeFpm39QK/fepLRb0P9mWjKlXKmvkvTSHrUZUGTEB4BUiep2Inig+tkAI8T4AFP+dr+hYDGPKvFlyBqWhsw+5gTyW7Tg6FVZyW4y69dH7bP9G6zytug7Oal7MDeTx7ocfeXp/px2nnThjn733TtPnvIZFjbp75wbyjrUj9chmJxqFdVsb6/DmzjbpfcYgMzHjjpI6MSK6SwjxHhHNB3AUwP8O4CUhRK3ubz4UQkzbFysavScAoL6+/o/ffvttz+NhooFWGPzeyKjr7sJujrlx/6DnHmFOU55zA3n8n8+fwlhZZS+hoJDv9XMbTWqEQlKFGa3dr3ouynbaM8uszMEMK+UYL8kd5efPSfKGGUYGSF/8LttZwcl3FCfhAj+xqhNTXuxMRFsB/A7AegAPCCHeJ6JPAHhNCGHZ84OLnSsHt4W5KuplVExYGkkCnn48njU8XtU9NDK1aem9v8auQ469HSeyYnbXVU2S8P0v3z/tfHk16EkinN9Zuo9pZYxSCULPY9PHATj7jtiIFfC12JmIZgNICCGuFX9/CMD3ALwE4KsAuov//qvXY1UCy3YcxaVrY1P/18RQy1edqQTQ81g4k6dbD2pzbgjPnhz25AWpqJfRimRVhGQmRGFMB/qHIy2JZcRdtWkl8lhOOn+7Cdc57XHmBq/dy/VJQ7mBPDoODMIiARLjkwJbXzpTch0bqckw3lFRJ7YAwItUSG+eAeBZIcRhIvo5gP1E9J8ADAN4TMGxYk25AQNua6mVMz4ZbAFkbiCPJ/cPTtO5y4+M4pvFOiKzMEluII9NLw4pKf4FMO3md8tFl/VLRhw7fwUNnX1SCuxR4dromP0fSeAkAUMLqTkhiEndiUFfNH823vrgBiaEmCbRlRvIY2PvoFRjUL0iidMwKyOPZyMmhHgLwP0Gj/8GwJ97ff84o/do3N6mPUfO+m7E7t10CB+VWy8d2jPlhbFEwJ98ynmBrR1utfKMuCNJlp/NKZeujWHZjqOxMGQquho77fy9ZtndjifrIOr7OlYttgwxy4axe46cddXZ2mtWpBfC2JsOElbs8IncQB5dB4cwOu5tInEbBpHdcF6y5bDrSV4I70WpfvPGjkeUZ3pp3rRZ4kFtOgWiQh1UnCcNN8LJmsfiJKz88d+TL1Fwi1XnbjMDZjT5OwnPzpuVwubckGtZLhX7YeXzkJlCS5z33ljF3idUZIYBzjbVNewMqP6mjWoqr8oeYkZhXK+4kXjyQ03fCq/nVtXEJjOOsPrb5Qby2PajM/iwWHhdm07hvrvmeF6cpZKEzzTMc/0+qr57J/NQlA0Zq9iHgKp+U05CORo9R85aeoAdB6Kv0bb3xPC0sJTbie7kppW4p6sPtxSu19xMTvpV8IwE4Qdl2WtmWZVOjJ+qdi1BNpMEgvHoZb6bkdFxJWPp+fL9eHL/Kc/v4xWvCS1xgDs7+4TXOH8q4T7d3O7CHZ/EVHFvnDh2/grW7jnu6rVv7vSvM7Mbbk0KfLN3cKqY2KosID8yio37B20Lj1UZMCD+auqbc0NY2NVXUsjup3ivHkLh+4tCFqKTpJyVu17zbyA+wkbMJ7xcwBe723DuqTbXE0kYcj5Bcez8FbR2v+pYSQKIXtdogYLXLCNCOykKHrQVQU3STnBznrwypY8Ykg1ZK9leJwg6Vi1G2kJoWU8Urx8Z2Ij5hFt1c7ev0+MmBBkn8iOj6Do45GqCjJI3BjgLO49PhmMUvPDk/mAV4sNMZU8SKd3LVUG2JYOdq5uQqU07kgSLE2zEfMKNIXGazmxG3ENBMoyOT6DnyFnHr1PdriRo3HzmsChoFcr9rYoJNiwDtm55PS52t+H8zkemDFiUlOi1bgsXuuW1G+MEGzGfyLZkHKmbJ4kcadTZUYkXazn5kVE0b3vFsXeitSuZO1MuzOIXbiZuq/1OVYr1s2vUfC9bXzoj/bcqIn9h1GJd7G4rKYRu+d4raOjs82RMnba0cYrZdRJkxwOVsBHzka2P3icVj06nknj6cWOdNS8EnWEWBiOj4+g4cMpVmO30toexLqT9ixkJwjMuzo/Vfqeq1is3FCiv5AbySovWZQgzkSI3kEfH86emUvXdMoOct7RxitF1IqvQH0U4xd5HNKNUXjBp9JgfIUDtPaPUudYPxieFa2WT7dmmkj0Mt8WpbtP/nZybVIJsw83lE5GbDFQViUHfPnja83s4xY3klRcWzKmZ+r3nyFmMe1SGcVMT6pa4GiwjuNi5iqh0/ba4hlBlDE1tOoWtj94nZajLlSac1iy6Le3IDeTxtwdO4ZYLBeh5s1IY+O5Djl+nR/X13dpYhxNvfWhpGLXvSkXHABUdHCoVLnZmkBvI49kKNmBAwRjI9nSKEprx1auclwvPymIkMwQU9t9kJlkvBsytx59KErZ8wbixqFmRutGCRfuu3Mo8lSNT9Kx95lk1SU8C2OuW18fiWo0i7IlVCf/+Oy9j1Kp3RIVSbatbr3Jnbr8vp2HLTG3aNpxup7Ji5XmrLPz2m6il5UcR9sSqCDPF6igZsFSS0PPl+w3FWFWzoTf6Elsq8Soz5HRv0U33ZQKk9n68yIQd3fiAsqagfjKDwAbMI5ydWEEUmvWdQr7Y+kXT6gtbXmrR/NlTxZaZ2jR6ip13oz7BxBGvSRlOjOCSLYdd6QzKjFFFUfeF7jbf09W94ncmYjXAnliMsOsLtPWlMxj30lZZMXFNtIgzdn2z7JA1gmv3HHfdr0ymoF+mqHvtnuO2GaFv7myLpEemQrXfrlN0tdx/bMQsiFIzufLMK83LOtA/bJtBpRoC8Exx7yRsL48pJduS8RSmlVWMcav0LpPAsHbPcal9PdkxPNPeHJkyE1X7XzKZmA2dfVWxJ8zhRBO0LC+j0FxDZx8auw4FJi2TG8ibXrDHzl8JzYAB5lqEMtJOVoXGcZaGChs3RdR+U5tOYXd7s+0E7maPzY5sSyb0wn9NmkrV/pesOolM94O4w0bMBLueXBNCYO+J4UAMWRT08giFG/FCd6m6vpkW4c8uXLG9ebZnmwwNmRZqcSLbZUVcW0y4xcvKW/W1NiuVwO72ZgxueUhqXH71Fcu2ZHCxuw3rltfDY5ckabR2SiqNl4bswnVSAN96IfjC8yDhcKIJshvcz518x/fsorAb29mFQC5fuzntsfFJTDWAXDCnBic3rTR8bblihp6tj96HjgOnSvb5UglyvO8Xl1RrlaxbXu+q8FfFtRaUhJEbb11/vanw+sLoSO00hH/zlvfMZBU1jH7BRsyEdCqBGxJp6UGE8tyoLqjE6mLNDeRtjcSla2NYtuOoqSEzw0y2Kyr7G3YYTTZBbbZr56x84ln6yTrL70+F5FRQBsyr8dC/PjeQx7YfnZHWPgzDeAHBquMv2XLYMHlHi0IB0SgPYCNmgowBA7x3cJYhyhP3RslxXbo25ur9sy2ZaWGof/jpuch4V+VFtZoXYrZabujsMzVk5Z6B14nSzMu1upZkEzsudrf5YqRbG+tMvSMrj94rRtdZFAlKqd/MgJWPhY1YBbBm2d2+HyPbkomcEXOjU5cbyCuZKNwUsloZD7cYqUKcu3xdag9u2Y6jJYZ9Bk0v7j12/opUGrlTzEKNrY11js6PH17lvvUrlBvzSsJN5MdN2FWmfCLMrgF62Ii5JGpx4SBxK7SqGWIVhsxN2rRXQ1ZueMyw8xKN3sdMncKPRAezUGNY13L5fsvyT80rkaV6bGk47XKiiBulfj8XAH4sDp3CRswFYZw0s9XzovmzAw+teQlpdBxQIwOVbcngQP+w40l+c26oZLLW1wLWzkpBiEKPsnIh4Z2HfuU6JFqOqvfxglVCTZCUL4gmhCg5p1ppy4bewVj1vPKrxnTNsrsdLSDD6pcXJGzETDCLzftVv2S0Ok+nEti5egmyLRnT1fNP3/jAl/FY4SWMMD6pLqxoFHqyQzPARkoH+k197TltEmWm4yRjzUjlXlZZX0ML1UbdkBl1EtAMMeBtEax9v3pDRgD+pLEOA8MjU3v5RMDaZe4Lq+fOTLpWZAkaVrG3IKjYvNUmagLALouq+yAkdcpvusauQ57j4Sq92dxAHhv3DyJCilummCVEmBGV/aCCLucg7PKdyssx/CheDjt8ZYdMJ4GofwZALrkDCOaz+KpiT0R3A/hvAP4AwCSAHwoh/jMRbQWwHoDmKnxbCHHI6/GCJIjJIzeQt7xQJmGtLD4jAduJxQtG4QinIQ0jlmw5jNPbHvb0Hhpx6WCt3ewL5tQYhhTLkzuiYMCc7n/uPTEcqcarYdQ3yZTDqIpG+MnpbQ/HQlZORTjxFoAnhRC/IKI5AF4noqPF554RQvxAwTEqFhmFhPzIKJq3vTKts+/m3JCvBgy4PSkRgLXFVfb2bJPnxoNXb04oDQ253SMLg5ObVk4LH/uZPu4U2QSWqGO03xZEfZNM8oXKJKcwuSMZfpsAz0ZMCPE+gPeLv18jol8DiPeZCRDZIuaR0fFpF36QK16hO972bJOSEKbqhJR961dMU/Z2uu8SFFExWOVE3YAtmj9b+m/N7o99J4Z9NWKyofYNvYPof/tKJBJszLAKf88g4I0djwQ8ouko1U4kogYALQBOFh/6BhGdJqJ/IqJ5Ko9VCazdc9zxa57cH27ILEqhIiO2Z5twfucjuNjdhovdbbjQ3YaMAhWKaiHqBkzWc7eq1fN7UeNEACEo/VUvXOxuw+725pKegLvbmyPTC01ZdiIR/R6AFwBsEEJcJaJ/BPB3KFwzfwfgaQB/bfC6JwA8AQD19ZWfDqrHTehrQkxPEw+aqN905YQp2cV4h1BocOkEOy9f8y7mzkwq25vVcJr0FCUJJzOirGiixIgRUQoFA7ZPCHEQAIQQl3TP7wHwY6PXCiF+COCHQCE7UcV4Kp2w5V5USd84CQ25Jeg2FH7JMVUzTvUcnSyyrt6cQENnH2rTqWl7zm7JuNA63XtiGCff+g1ujE0iPzI6rU4xqgYkCqjITiQA/xXAr4UQu3SPf6K4XwYAXwLwS6/HqiS8TK5hy72oOn4Q9T5htLHRGyyt6HVhZ59U0WvYBtAsczJMyvUcjQqJ+9++4inZSNtzVrFH1bFqcUmdmCx677G8TlGfeTtvVgpbvqDG4FYCKjyxVgB/CWCIiLRv+tsA1hBRMwrhxIsA/kbBsSJNbiCPrS+dwchooWh23qwUapJUMilocf1tPzrj+jhazN3Nik9PKlEIT4ZRXxWUkkCQbWzKjY1R0WvXwYKXYDQBuRENVo1R5mTY6L8rs0JiVew9MYyln3SmIVmOvvuCH6HsD2+Mo+P5UyXHqmZUZCf+PyiErcuJVU2YVwrFoKW9r4zaOpy7fN1z7YUmOux2xacxPhm8bFXQOn1+trGxMyxGjVVHxycs6/6igD5zUkVhu0rsmtWqwKlHlhvIY2PvIHyudilhfEKwh1aEZacU0XPkrONmjWbMMullptVqnXzrN8qKEM9dvu66gaIbZtckAt3PC7ONjZkXGHaTUyeoKGz3Qqosfzqo76482aI8yhJFPrwxXmLYolAsHwRKU+yrGZU311Orl2Dd8vqpsCEBmF2TnKrVUu057T0xjCQR1i2vn5ZOm1Bcy3j15kSgyRbZlgzmzUopf98Fc2ps/8YsIUFF48mg2J5tClVEdkKU7h8H+d1pCUxalCXKBsyIY+evYNmOo/Z/GHPYiClC1c2l9XTS6p12tzcjkSBcH/M3hKKpGTR09qH/7Ss41vkgLnS3Odovk9232fajM8gN5PHp77yMhs4+NHT2YWFXn2+p+1u+cJ/S95NV1+hYtRjpVLLksXQqKd14MipszzaFVms3KUqTc35z7aPAjq2FUVVGWYLm0rWxqXvsvu8eDjxbNwhYANgjWqaUyn2X2nQKvx0dx121afzb727i5q0go+0FNCFX2bClVm8j+/cJkksoKReUdUvztleUrKSdJlgYqbdbvVfY2YlmqNTQm0EFD0t25tHqxIyakPrN7vZmfFLUzfoAACAASURBVLN3MJKqL25xU3cXNlYCwGzEPGA1QVUCThTXdxeV9hd9u0+5nqMKQ5YbyHuejJJEOL/TmcyO3fcXBQNlh9smqHruSJKhRFEQXRi8kE4lMXNGInahRFnism/mq4p9NVPJBgwoTPyydUPlmVIqUVHcnW3JeK4l0rJCZYmDArgRKlLsZ9ckcWNswrY2zs/sURWMjk/4ng0ZJsfOX8HCzj48Y9HuKeqwJ+aCMMIaYZCpTeNY54ORmIxVeSxuvWen3qDsd6byc6noJOzGgHn5DCo8ZEYd5c0wo9JN28oT48QOh1SLAQMKhaRR2Qhu7DqkJPEj25JxlG2XTiWxu7050rp2WgFwfmQUAreLqt2cu6CLnLMtGawNMfuRKaW8t+G5y9cjn+HI4USHBG3AEkCgRZTlbOgdxB1JwkcT4UtdlTdcdNuDSzNI+pYtZuxc3RT5MEtci6o1tPMR9Q4JYZHyufGtHZeujYUuOm4FG7EIkyTC04/fj/63r4R6g380IaaFGaLApWtjWLbjqGtDpt2UVqG/KBoB2VBlnIqqf/rGB/Z/VIWsW16PpZ+sC33/fe+JYew7OQwhglfdsYONWIR5+vH7p1ogbM82KUsTd4O+XUWUsjJVhL/Mklf87lnrZi/Jyf6km9pFpwLAMyS/JLvSATcGd3d7M57cfypSslhe0fahy4lC13Ltaw6qQ7YsvCfmkCDah2iUewFRSfPNtmSwu7057GEo4+SmlYYGS8C6uaIVZgZKa9bpd2q926Lqk5tWSqmRAAUDJtMY0UrYWMONwc22ZCrKgAHArBrjKXnf+hWhKqcYEZXwL3tiDjm68YGqSu7QMKoV0mpMNueGpPaXoozZyL2c56BrwDK1ac/ZiQBchWfNkE0KcCpm3dpYBwBTfbcqhXOXr6O1+1XD86gPgTut3UsmCBM+qI7kBvKhh9wr1oj5qXygpZz6mXpemy7V+1u757hvx5LB6IY5dv4K1u45jn3rV2B7tglr9xwPPeRRzYTRPNEqtX9zbkg6NKlvX/JeMcvSDALw2NKCVxK2QLEfaHVz5b3E9IXJeoOmYba4XjR/Nr7+2UVTykKa4a9NpzxHd6xaCwVFRRqxKPRl8kKCgK2P3tb7i7Jx0I8rrDFGYTXoB04XSUFkI1p5APmR0ZI+V/tOOjMu2tj/9sAp3LLwGgSAjfsLE/vST9ZVnBEz49j5K2jo7JtSxynHKEqkr/Ny0sNOlihkwVakEYs7MxJUclFE1YBphG1EVNxEZn3VgtwD1eNmcvGajajXAdVW6xmddyWzmBqfEFMNX2WifNq14zQ8NimArS+dCUVXNGw0z8zMkAVN2FmwVZfYoTIsN3dm0v6PXDAWck2WU7598HSoRdEqbqKjGx+YZrCiolYgi5dOCvqCaeC2grsW0vpUZ5/0YurDG+NTYSY7NvQOoqGzz5U3NTI6HpokVHl3gqDRK/t7oXzbwg1htxaqOk9MpVdzetvDWLLlsC/1U1EOIZZzY3wy1JR7VTdRnAxWOV5bvNh1THbq71Sy3iAA3JFKhPoZVXk/Wx+9z9O9G4XWQlVnxFSjr58C1BmfuBiwsAnzJlKlV2j0Pk7xqiwSdkgobnx4Q225C0G+NQ0AzKpR4wlqwthuPOF0KhEJRZuKFQC22lPwO7kjTl5UnCncREtCuYm08Jt+NZ5OJaVvav3+U/kElk4lpVf5Wh83r7R2v6pMTV62Vxxzm3XL69H7s3ccNd9U1WsPcNYXMQzFjqpsxdLaWGdoSLT6Ej/R0mCrsZ4sKMr7IOlr1YK4ybzoFZYbwPJpa3R8AhmTFiV+LcA6Vi1WoiafIKDxTuMkGcaY1sY6/PSNDxx3j/baoqg8AtDw+2m899tRy4Qcs8zIMKlYTwyY7hEF3QAuN5BHx/OnMO4gUWNWKoEbYap9xghtQrfLbJNVlnCCWTNHma65Ml5PGN13vaZbz0oV8sT4+g0Ot95YbiCPjb2D0nudCQC7QjRgVemJAQi9Y2nPkbOODFiCgKdWL8HOQ78KvCVGHFnY2YcL3W147uQ7ln93SwD3dPUpNWRmzRxlkkxk9p/CyPgy8/6s0BYSbhZsjHfcahh2HTwtZcCIgAuKF4CqqboU+yDIDeQd7zFkatPY9XhhpfNvv4uGRqJbEpKisF4FdgUK37WM7NAtxXNrx6rF09KsZZNM7AxUWMkqHasWI2Vy8szq5Ro6+9DQ2YcNvYNswEJi74lhNHT2YWFnn3TPvVFJbzlCgTpT2IgpYnNuqOSGdrqiff+3o+h/uxD6jLsWnGxoX8WnfHL/IJIkZw5bu19VVs+Wbclg5+omZGrTIBQWIbJJHUYGUPsETt5HNdmWDHoeu7+kdmjerBR2tzfj659dpKSmyAt+dxXwk9bGOt+/P4GCQVu8+WXT6zw3kEdjV/id2lVS0XtiQaA6E3Hd8vrYi+nGCbeNNb2iKj3fiHs3HSppYnpHkvDGjkcsX2O2r6h1K+g4cMpx4gFTWjAfRguj2nQKWx+9z5UqClDY5/zV333ep9HJY7UnxkbMA34JAKdTCWl3vxKYQerDfU4Iy5D5gdk1aWXI3ExuzHTsOjCHqbg/c0bCsURXgjC1xRE2VkbM93AiET1MRGeJ6E0i6vT7eEHhp4J9NRkwoGDA/JLwkqFSkmju3XTI9LmPLPar7BJjGHtaG+ssDRgQ7jaBEwOmhcejYsDs8DU7kYiSAP4BwEoA7wL4ORG9JIT4lZ/HZeLH1ZsT2N3ejG0/OqNcDaEa2JwbsjRUVnDo2hta6Y6fC9sgcVPaEXSdph6/U+w/A+BNIcRbAEBE/wLgiwDYiDHTCFN/0SlGE1aYhaBuw4GVMvEGTUbxPmZUcNO1oTwcPSEE9p4Yxt4Tw4HU5vptxDIA9LGKdwEs8/mYvm6aB4lZ4fO65fU40P9uVbah8IMFc2qmPeZmE96qRYYVuYE8Nr04hOtjBQUPArBWsohVu9Zl0BqYxh2nOoN+kB8ZndYQ0kwlSBb93qzZPuW65fVY+sk6R12wnRzfqQi23X6qvnGuX/htxIyyYkuuPyJ6AsATAFBfX+/5gOWTj9ZKAgi3+6gbnlq9BAAMDfL2bFMo2U56KqE1/NyZyZKkjnKD4hSnvc1yA3k8eeBUSet4LVUaKC1i1Yds3OgTVoqeZ1SuuNHxCTy5X9cEdP0KT9nK+utQO+9WITpZrUMZEmXHl0E2Icjv687X7EQiWgFgqxBiVfH/XQAghNhp9PcqshODFP71OxQzb1YKQqCkhbj+YlYp2lptpBJAz2Ol4T8ViwKnclFW5zBJhPM7CxmFqjIIy+8BDid6R/MMy0OMLd97xdX+boKAv1gm54mrui7chMIbuw5JL2K9ClWHmZ34cwCLiGghEdUA+AqAl/w62Mpdr1k+r/qG1Wpo3EDF16eS5iWcH94YLzFgwO14833fPcwGzCWtjXU491TbtJtWhVfrVC7KSoJKP0GEmQIf5yLjINDOkhb10VQztnzhPlfvNykK51tGfWN7tgnrltdLF/yXo81DbqJUTqIwV29OYMmWw46PIYOvRkwIcQvANwAcAfBrAPuFEGf8OJasYrxK1QYv3VUF4Emqx224KwgudrdN/USJdCqJ3e3NvsbnncpFWRk9bWJStfgy6uBgdo70SiRRCd/Fhb0nhpEbyHvevpAtfdiebcL5nY+4ut8+lk65HqdTw+lH82AgAAFgIcQhAOYFLIqQbf2grZYO9A97nszYE4oXsq1S3JIguX1XfeLRx9Ip0/2tNcvuto0uyGKVJWY3+XHY2jnbfuR9re5mv9mpiHN5pMcJa5bdHYki+YpWsbfi2Pkr2Jwbct3GwIsXVum0dr8a2YxQPzsY/8Uy48SkQv+w04ZF7NokoldU0LITAfnFmR7VbVw6Vi32NYHIS1af/rOatccJgw9vjKPjgLfvTFZIW4+bc7Vy12uOsxKB28knYRuyqhYAdqNUoPXh4ZWpOZq327ztFdxhsefnhBmKNmaswndux0ow7+ukJYvYqbDcvDVZEp7ZV6yzccMdqYTjkLnWeWFhZ9+0kHu2JeNrM9l961e4fn+90aqdFa5AcTlehXfcXI7ZlgzWLXeW5X3u8nVp9ftyguzubEbFaCd66aJsV5CnD/9E59uqHlQpIqRTySmF+CVbDpfE6LXsqXLxXCNqkoTvf/l+wxVveWju0995OfQmkUbXt0w7+vLXLfp2n+eJuRwjgVmnWaIL5tSg65FPO2ryqB1bgJTXW6nE7b6y06xFL967k/vS7eepGgFglYbMy3sx6tCfF9lzom/UaFRjV27ArNCrkGvYTbL640dFhUT/PTqpZUolgFTSv27jRplxQRr+RfNn48bYJN4bGUUignWPbid9N/uY5ceSFY2QTbX3kuhVNZ2dyycbJysE/U3NBswc/aQTRI3R8fNXpjK9jm58wPbc6NU3si0Zw5vOSZbUucvXXX/OqBgw4Pb1vTk35Gj/aXwSGJ/0z6AYnZ8gPddzl68X9uQ6H8RCB+d5d3sz/vbAKdyKaHsar3u/2raJdibyI6PY2DuIf/jpuZL7r7WxTirBw0s5kh0VvSfmNs7OBswcfUKL29oUJ0yiYAy0PZqrFtlUUWqpoqqMww6iQlhMln0RyCbTY7UXFxTHigslJwVx2ZYM3nzqEcf7T0HhtF6xnK6Dp6eFZicxfW48dv4KLnzwu5JaNe2a1Eo0/NYUrShPrJx961f4EsevZvQrvCBTbHuOnMXf7h+07DsWJQOm6er5Qfmk4CRsGSW/gQglGoB6ibigcXLcGbq0wbAz88zoWLUYHc+fclSHqq9tc9IO6tj5K9i3fkVoSR4VbcQAQFYj18/sKze40cYLAv0Kb3u2KbCbWDa+bxRuLM8cnDsz6VvhJVAwuDLJArXpFAa3PARALjRr5mlmWzK2k3DUrm8ASM9I4EaEkyrM+MFj9wd2rMauPujtkL5TsxXa805aG/lZQ+knFR1OBOTc6mlZWC7aEagkSYS3draFPg4jLl8dRUNnHxo6+9DyPXUp9Cow2y8rl/DxouEmg4zBTSUIWx+VlyVaNH+2a08ziHYYbohj89eg2+2UO1Ijo+Ml4XUrsi0ZDHz3Ielj6aMsbmrUwqLijZidDNDF7rZpN/jRjQ9MMyCL5s/Gxe421zpyu9ubkZGMU69ZdjeAaO7N6eedD2+Mu27EqJoFc2osv6+ohX3qZqfQc+QsFnb2YfHml03/Trvu3BSjauiv7yjt4XjdtwkaVQZMxcLPSfhT1gvXn4/GO+UX0GF7+RUfTpQJtRhhNmk8097s+P30qaUdB05h3CJO2NpYF4kCwjihhdnsQnKaQsvaPccDGpk5l66NTf1u1hfOiQd1sbvN8PNf7G5DbiBfElZKJYBbAhCisC81g7wX5rohPzIa2bB5Oa2NdZ4NmFGKeRBlGDI1lqkklSz43/rghtR7L5o/O3Qvv+I9McC8PsFN3UK2JYPd7c2YJ6EOMLsmWXKMbEsGPY/dj9r09NfWJMl3cdpK5fK1MSmNQc0bi0tfrcvXbjr6e73wsvaTG8ij4/lTJfsi45MFAza7JolnHm/GuafCE2qeFKWJEk5JJcj30JeKcKzZXOPFMLpV2TCiPAHEru5Lm6+8RAhUUfGemIZKRXV9/VFuII9vvXB62mo6mSDs+NJ0j8qsdskIr51iqwUB+dCr6to2P8+R2WdatuNoiSenp7ynVc+Rs6YZatfHJtDx/Ck1g/WAl1qr8UmBdCrh2/7a3JlJ7Fu/oqTwt9agz58ZCQC7fKqRMmqcaoSssdvQO4gNvYNTHQzMzoqZxFpYVJRiR5jIVLfLVsDr8dIplok/5YsvKwOmQQD+pLEOF38zKpVk4lT5PGoQCuGwMYf7s7XplKUh0qSYtJIJp/JUspmEXhZW+sapRrhtmmkW5g3LgFWN7FQUcLJiSyUIPY/d7+tFzsQbvYSVk3TpasKtEV63vB69P3/HtpYqSdOzBO1wokXo9f62ijI56b5czswZCdyaEJgQoqSjfBhUjexU2JRv0tpNOOOTAht6B7HpxSHs+FKTqTHjsGJ1w964OelU0nWrmJ++8QF6vny/7eLATQKuylY4XvCiBXnz1mTkGtsaURWJHUHx5H53WUbXxyawoXcQDZ19hvFrL60qmPiSoELtGxswYzK1aexc3YQD/e7KJ94bGUW2JYO2JZ9QPLLoEIQ0XNiwEVOIipKpvSeGcd93D08rZty3fkUsVkWMOhrvnB3JWkGvEG5nUrqtWyMAxzofBOA+21Sri3LTV9CKIM2GXe2pVnPqBqMs6ijCRiyCXB+bQNfBoVDEUKMIYXoadhTVTFSRJMK65fXStTpxQ19Ue/TM/+fpPb71wmlXryfcFkIIs/2K13vcTszB7R5WAnCkKBMmvCcWUUbHJwy1zKxSXysVgdtp2EG3ggmSckWIqKmMqCCVIORHRj2fO23yNisUt+MZ3XedVNxHTFaJRKYBqxla6r5dUpibWjLZrMqowEZMAX5tvBv1BFq7vL4iJzdZNvQOxubmcsK65fXTPpfqyTVs7FLanfDk/lPof9v9Paf/rlV2Y9ASTexwY8AytempEKosTj6XvvN5nOBwokvu6eqbEsL1a+PdaEUXpSLDsKikMGttOoXd7c2G53X5p+aFMCL/UGXAgEII0Ivh0V9D27NNyiZCWSPgxgP77L13uhmSNFr0J26wEXPBPV19ln2tVJBKEG6M3Qq1WWBU0W40t/tiUcnX2t3ejMEtDxlOepyV6C/lk7UKVY1MbdpXL+aF1/O+zwNeO0KHARsxF/htwGrTKYAKdWYCBaFUTvS4jXajudFti8KeYoKMFdFzA3m0fO8VNHT2VUxWYpRU8/WUT9bZlownDUbZMKIXZD2lzbkhNHYdcrXvGLfOAgDviUWORfNn48bY5LTQy+j4xJS2WbXj9kYjKgjfhs1bO9uwds/xknO5aP5sXPzNDUedeONAkI1TnWB0De16vBnf7B10tchxspd076ZDLo5QwM5TciszpeG3IfYDNmIRYtH82Ti68QEsrLCsO5XoU6PdvDYKJsIoEahSPC89US6D6Fi12FbKK0nAnDtS+O3oOO6ykbZyEkb00oOv1qZ7hpeat1mpROySOgA2Yq6YQf6EFLXwmN0NU+1s6B3Ek/tPOSrkrHEhEOsHCYpPKxgvLJhTE4k2HWYc6B/G8beuWPYymxDAzBk0JSFlJr68YE6NX8Ochl0kwUs261Orl7h+bZh4EgAmoh4AXwAwBuA8gL8SQowQUQOAXwPQArgnhBBfs3u/OAkAq65RWjCnBivv+wM8d/Kdikqr9psFc2psVd39WnQArGtpRqY2jYbfT1fEd6PvJ1ZuyLSGrLKoKscxE+T1IvjrVBHI6rPMm5XCli+oqzXzTcWeiB4C8KoQ4hYR/T0ACCG+VTRiPxZC/JGT94uTEQPcGbLWxjq8efl3thMvo46gWo3MnZnE1Zul7Tq0lhZJIiRIhNJBmVGDUTKOE/zq4qw3aG73xLS9+PdGRgv92W5Net4/TiUJPV+279Ihg28q9kKIV3T/PQHgy17eL244nRy1Fd3izS/7OCqmnKDShq/enLDst1RpCiPVhj6xStu/liU3kMdGlwLhduhr5rZnm/DSQH7aYsoO/Z7sDUUrrfEJYag6pBqVKfZ/DUA/Oy8kogEi+h9E9KcKjxMZZBIMMrXpKbFTLSThViqHcUeQwdl9JqvgajJgKS+56jHh3OXrWLnrNem///bB05b7byrYe2IYDZ19jg2YnwSxgLQ1YkT0EyL6pcHPF3V/swnALQD7ig+9D6BeCNECYCOAZ4lorsn7P0FE/UTU/8EHH3j/RAEis8KISsrq7vbmqmjLEDZG89SSLYcDH0eY/N4d1ZEv5iSjVJV3EzeCqDuzNWJCiM8JIf7I4OdfAYCIvgrgPwBYK4obbEKIm0KI3xR/fx2FpI8/NHn/Hwohlgohlt55p7+yKkHjNYaukmxLhhNGAqK8KD1KK+Mg4O7TjEYQi3hP4UQiehjAtwA8KoS4oXv8TiJKFn//FIBFAN7ycqyoYpbRc7G7LTIGjOBOzZpxx4beQVZX8Ykkkac+ZGFRrTGQIOZAr37/fwEwE8BRKoSqtFT6PwPwPSK6BWACwNeEEPHPtTXBaWrquoCV6AUqs61HlNE28aOykKkUtGhC78/Cv56dFHOnU4mqDSn6jdfsxHtMHn8BwAte3ruS0bLX2LBULpMCU5lZRqn3jHuikCSTgDPtzlGfDNi8WSmMFDVW/WLmjISrZLTWxjofRjMdFgAOie3ZJsceHBMvtPKL09sexoxqjSdVKE5V7/1KcBj47kN4RoECvxnrltfj7//jElfiyFo2tt+wEWMYH9H2xn7weDNm1yRDHk1wzJ2ZxNyZlfl53SRsdaxajFTSn5VMtiWD3T4Ystp0CtuzBWHjxjujq4NZHbmwEabSuvcypVRr54FKDp/qz6lsNEUzelaCw17ItmTQc+SsUmWarY/eB6DQ2y7KAtXsiYWMExFbPUHFmxkmzvjt/TrZn8u2ZDDw3Yd8G4vKdPZ5s1LItmSQG8i7MmCzUsGZFjZiIbM92+Q6XXjd8nouYPYRQkFxhYkv18cq1yPU3/sqdRlTScKWLxS8sK0vnXH1HkEq4rMRiwDbs02OV4yaevQffOyOqq1B8RsB4Fjng2EPg6kw7BaeaUkvRovi5Aby6DpoXwcqs1ieNytVItpb3pxXhgSCLS3hPbGIsONLTdi4f9CRvhqn6PuL5oUtmj870nsCTLxYs+xuy3tXJh1/7szkVKlOz5GzGB239zi3Z5tMxalV8jGbxp2qYU8sQvgtEBo2cctW++y9BRm0oxsfcFTYum55PafUx4DWxjrDveVF82f7GqZXYUhOb3t46nc/RXbd7G2NBCw7xp5YBPCzTUNU0LK43PY7CoO+0+/j2RPD0K+LCfaq+HH5fNXOsfNXkCTy1D4njMVK+YLKr07wa/ccd6UyEoTorx72xCLA1pfOVLwXphFEOEMVH94YR/ktrOI0BZm5xVij9eIy0xa1SqGfQcCbO4MXLChXClGVlZgbyKPle6+gobMPDZ19rjpQp1PJwDt3sCcWAdxsnsYVJ0LEqQQqshPyU6uXYGPv4DQDyYTHcyffMV1gVYqyzsKuPqxdVkju2HdiWLlUVaY2jY5ViwPXC2UjxgRGnEKJftL/9hXsam+uyiLoqBIXwYHyvTon95QQ/oS6rcKxQcBxDcZ3kkTYnBvCcyffcfS6uHlhhMINbZfAon0PnPvBOEUvjhD2onB2TRK725tD3yJgTyxkqqHvlLbvUOnMKaY9b882YcmWw6bSSxNCsBcWIDLJOFFkdk0SN8YmIFBYCK5ZdneJwXC6KFRBa2NdYMK+srARC5meI2fDHgKjiKs3J7Cwsy+WE2alkkoQ2j9jXZcFREuZRXYPLowQaNQMGMDhxNDxs8aDCR42YGrRQrRuQq+16RR6Hrsf27NN2N3ejBoTFflUgnBj7BYWdvahtfvVQKIjVh3hZWHJuQIkIrShuXTpUtHf3x/2MAKltftVX2o8GKYS0JIGZO8TmTYpuYE8eo6cxXsjo/hYOmWYHTwrlcBTq5dEujO3lz0xNyHW2nQKg1v8EzC2goheF0IsNXqOPbGQcVtTwaswphrYV5ykZSIWmvK6HdmWDI51PogL3W2m5S03xifR8fypSO9Za+LhTmeCTG0aFxyWDSRwuzVL1GAjFjLZlozjtiqZ2jTO73wEu9ub+QQyFY3mLcioQGjK67LYGajxCYFNL8rXNYbB9myTI49KX4x8h0WTzhm6Vs616RR2uWgEGhSc2BEB9q1fMZWCPiEEkkT41J2z8Obl69MuUP1FqF1UHQcGY5eOzpSSJMLTj9/PWYsmdKxajCcPnMKEibRNeRixPMGGgGneh0xS1fWxiSnpqbgXPZcXI7+x4xHcu+kQPpoo/U7DrvtyCu+JRRx9/P4ui4r4sGtGGO9c7G7j7EYDNOORG8hj04tDUz3CCMDa5fIKFOWGzM13HUVDZqfvaGTA44bVnhh7YhEn25KxdOM354bw7MnhqtFerGQauw7FzoDpEwRmpRKuBGNlMboXHClWlP3fL+HcKBGWvmOQsBGLMex9VRZxkT7S0Fb4WrTAL4OQG8ibLuS8FPx2rFqMroNDUr24okB56O+OJOGNHY9YvqbSDRjAiR2x5tmTbMCY8LirNj3VVdhPj8Zq78qL4c+2ZLBzdVOkCp3NuKerb9re1UcTAvduOoTd7c2GrzF7vNJgTyzGcAiRCZP8yGggiShW6fVJIs+GTPPyjJIc3LBy12slncAXzZ89rX2KE3IDedwyGdZHE2Jq/DJ755UIGzGGYSJNgsg0pLhmmb2klCz60JxRsoRMUke5AQOAc5evY+Wu11wbMpksSru980qGjRjDMJFmQgh0PH8KAKZN1NuzTb7sC7vJQswN5KcZMA2zx2VgaTprPO2JEdFWIsoT0WDx5xHdc11E9CYRnSWiVd6HyuhZsuWw8vdsbayLZAoxw4xPCGz70RnD55zsad276ZCqIZWQG8hj435/Qqsyhd5aN2b9T7WgIrHjGSFEc/HnEAAQ0acBfAXAfQAeBvB/EZF1kyXGEWZtPtyQTiWwu715SqE6DhvdTDxJp5KmQrx2fHjDWCKqY9VipCTfU8WelxE9R876tkdt9fl2tzebGqxqMWR+ZSd+EcC/CCFuCiEuAHgTwGd8OhbjkV//3edLwjRu9RxnpTjZlTEnSYTR8QmMKTYk2ZYMer58P+bNSil9Xyf4mZ1p9Plq0ykpseNqQMWe2DeI6H8F0A/gSSHEhwAyAE7o/ubd4mNMxDDyurItGWx96YypOKoZfha6MvHHax1cbdrcSGmJDUaJFX4ThEhwNSdu2GG7dCainxDRLw1+vgjgHwE0AmgG8D6Ap7WXGbyV4RVMRE8QUT8R9X/wwQcuPwbjBoK51xVV1P/0NAAADuFJREFUxWqmepG5Jo9ufACL5s82fd5K9NYNuYE8612GjDLtRCJqAPBjIcQfEVEXAAghdhafOwJgqxDiuNV7sHaiPH7Fu/U1LdUSU2fiRWtjHR5bWo+NvYPQ+/7l9VhuFC6c8qnOPsjGH/xKmrK6TyslUcs37UQi+oQQ4v3if78E4JfF318C8CwR7QJwF4BFAH7m5VhMKa2NdTh2/ory9/Va08KoZXd7c0Wv9BfMqcGla2OOXnPs/BXDa//c5eto6OwDEbB2Wb1yg2WErAFbVxQq9oOL3W2u69oqAa878d8noiEiOg3gswC+CQBCiDMA9gP4FYDDAL4uhIiHQFlM2Ld+heM+ZLJoewrVIlsTZSp5H6Q2ncLJTSuxYE6N0vcVAth7YtiXMhS3+N3a5GJ327SfasGTERNC/KUQokkIsUQI8ajOK4MQYocQolEIsVgI8bL3oTLlaCnxfpFtyWB3ezMytWkQOPU+LCr1e9f2uE5uWunLxHv15gRW7npN6Xsy0YNzomNOQu0+9RRaweSB/uGpVu7HOh/052CMJW5LHvzGSyTALD1ctSELOlPRCL8iJkwBNmIx5y+W+RdrBwr7D2v33M7HIZ+MJjMdbR8lqntiTvZk1y2vLwl1BRkm9csbk02t9ztiUu2wEYs527NNWLe8flpNw7rl9Zapxk7QT1ZrfTaaTIG4tYi3YtH82Y4+i2rPRUv4UF3P1XXwtNL3Y9zBAsAVwPZsk+kksXbP8RIj1NpYZ7oylEmp147z3Ml3MCEEiAob6Yw6apKEpZ+sw+LNL+PmrfgXkL/74UeWjS3L2bd+xbTrVgWaR6vCC8wN5DEqUdyvuCyNMUBZnZgKuE4sXLzUm+QG8ug4MAgW7ahezFK9gUJyits9VZX1il7GoefT33lZSqGGpaHUYFUnxuFEZgqzMI5deGfJlsPY0MsGrNqxMjZe2omoTPZQ1dZEVmKNDZj/cDiRmcIojGMVfgQKBkyloj5Tmci0E7Gi3JC5DTd6HYcTuM4yGNiIMSU4zaRiA8bIoLpMwO2+mYpxyCaIsBcWDGzEGIaxJVOb9tRuxI8JvXzBZWfUVOxPbc4NYZ9EJ2muDQsONmIMw1iyaP5sfP2zi9B1cAij47c973QqWfL/sPG7HmthZ59xK44QxsLchhM7GE/Mnem9YTdnIUeboxsfQLYlg52rm0okyHaulqv9Uq2NGAb3dMkbMNXtXhhr2BNjPHF628OOkjv0dWWzUgk8tXoJsi0ZRy0tmFKIAAiThn0e0YfFjBozHugftgzhLZhTg5ObVvowsmC55eDLDUI9n7kNGzHGM6e3PSxVy2NVo7OrwluOGOFUlSM3kEfPkbN4b2QUd9Wm0bFq8ZRR2Zwbwl6JvRonLJhTYxsWM0qwSCWAnse4PooJBjZijBLs+pulkmSZGZZtyeCbvYO+eBNRI1NmgGSxalGvGcN9J4aVfYcr7/sDqb/j/R8mTHhPjFGCVX+zebNS6Pny/baT9lofGwdGhXXL63Gs80FfvJTt2SZcKArsqqhRksnCqxZmSG5z+dn8kjGGZaeYSLE5NzSly1hJJImwZtndgYr6NnYd8vw9VlNzRTtkQub8ffmDlewUhxOZSKGJGavUywuLRfNn4+jGB0I7/ppldyvfJ6tmLna3+bL3yHiDjRgTOTbnhsIegiOiKvKqeX086apje7aJv8+IwUaMiRzPnXwn7CE44sn9p9D/9pVI9v/St+lZueu1SHQ6BkrDxkahVjtP/I4kcSo7A4ATO5gIErf9sAkhsPfEcORDoEc3PoDd7c2oTaek/j7pUxtvLSSnnWf996f92PHRhMC9mw75Mj4mXrARYyKHX5NnEETdkGVbMhjc8pDU365ZdrcvY1DlaX80Ec5ix0yBpBKUSeIIGzEmcvg1eTohSTStZKC1sU4q+0xW5TwsZAyt00JsJ8TN0y7n5KaV0wxWpSiTxBHeE2MihzZ5qki1t8sQNMs2s0qHTxJZjqvnyNlIJnoA9gaWAFzwOU3c7vtzQkNnXyhp7WywogN7Ykwk2Z5twvmdj+Bid5t0AWm5GHFrY51tivv2bBPWLa+fCmEmiWy9EDtPUVX3YD/oOXLW8vkgmkZGwdNmKgf2xJjIU+6ZqS4c1mfwyf69VZp1kN2DnWJnYK2kwcqFnufOTOL0tocdj4FT/xmVsBFjYoFTQ+M3F7vbDPeW0qmk8i7GKrnLprmlWRjUqFPB1ZsTWLLlsCtDduGD3zl+DcMYweFEhnGJplFY3mMrqvthQMHTSqeMe8BZ7S2ZtdqRbcFTjpVYNMM4wZMnRkS9ALRlZy2AESFEMxE1APg1AC0Af0II8TUvx2KYKGKlLB9FtLGatXRxw72bDoVWeMxahYwnIyaEaNd+J6KnAfxW9/R5IYR3KW0mNtilbnMacjRwanjX7jlu+XzQ9VpsuBg9SsKJREQAHgfwnIr3Y+KHTO3RpWtjWLbjaACjYVTiR+jPrG0PwzhFVWLHnwK4JIQ4p3tsIRENALgKYLMQ4n8qOhYTYy5dGwt7CJGjvDNya2NdxTeaNOoIzTBusDViRPQTAEYtXjcJIf61+PsalHph7wOoF0L8hoj+GECOiO4TQlw1eP8nADwBAPX13FCOqS6MJvJj569g7Z7jVWHIrDDy7jmUyJRja8SEEJ+zep6IZgBYDeCPda+5CeBm8ffXieg8gD8EMK3jpRDihwB+CBSaYjoZPMP4RVDekZknEiUPpbWxLpTxsMFiZFCxJ/Y5AG8IId7VHiCiO4koWfz9UwAWAXhLwbGYmBMHkVQr76gasTPe8ZVrZioBFUbsK5ie0PFnAE4T0SkAzwP4mhAiOktLRjkyq+a4ZCdGxTuSbUsSNmslZcEYxg88J3YIIf43g8deAPCC1/dm4kUlhH+CNhoyobqwRG5liZKSClN9sGIHw4TIvvUrpNLNGzr7sLCzD5tzQwGMimHiA2snMowkftU27Vu/QsoDFCiI5u49MSwlgly+t5dKAD2PNU8VOucG8kqVOxgmDNiIMYwkUUp5nxBiSgXeyJAZJaeMTwIbegexoXdw2t/nR0bRdbDg5bEhY+IEhxMZJsY8d/Idw8fdJKGMjk/Y9htjmKjBnhjD6DBrsRLVxIoJIZQmo5j1G4vb98JUDyQUtQlXwdKlS0V//7R6aIapCqKQTp+pTeNY54NhD4NhSiCi14UQS42eY0+MYSJCuVezOTcUaPfjqDf0ZBgj2BNjmJiwOTeE506+gwkhprITVRq53e3NnNTBRBL2xBimAtiebZqWiajSiLEBY+IIZycyDMMwsYWNGMPEGFXZgZxlyMQVDicyTMxhA8RUM+yJMQzDMLGFjRjDMAwTW9iIMQzDMLGFjRjDMAwTW9iIMQzDMLGFjRjDMAwTW9iIMQzDMLGFjRjDMAwTWyIlAExEHwB4O+xxeOTjAP4t7EF4hD9DNODPEB0q4XPE+TN8Ughxp9ETkTJilQAR9ZupLccF/gzRgD9DdKiEz1EJn8EIDicyDMMwsYWNGMMwDBNb2Iip54dhD0AB/BmiAX+G6FAJn6MSPsM0eE+MYRiGiS3siTEMwzCxhY2YAoiol4gGiz8XiWiw+HgDEY3qnvu/wx6rGUS0lYjyurE+onuui4jeJKKzRLQqzHHaQUQ9RPQGEZ0moheJqLb4eGzOBQAQ0cPF7/tNIuoMezwyENHdRPRTIvo1EZ0hov+j+LjptRVFivfwUHGs/cXH6ojoKBGdK/47L+xxmkFEi3Xf9SARXSWiDXE7D7JwOFExRPQ0gN8KIb5HRA0AfiyE+KNwR2UPEW0F8DshxA/KHv80gOcAfAbAXQB+AuAPhRATgQ9SAiJ6CMCrQohbRPT3ACCE+FbMzkUSwP8LYCWAdwH8HMAaIcSvQh2YDUT0CQCfEEL8gojmAHgdQBbA4zC4tqIKEV0EsFQI8W+6x74P4IoQoru4qJgnhPhWWGOUpXgt5QEsA/BXiNF5kIU9MYUQEaFwwz4X9lgU8kUA/yKEuCmEuADgTRQMWiQRQrwihLhV/O8JAP8uzPG45DMA3hRCvCWEGAPwLyich0gjhHhfCPGL4u/XAPwaQCbcUSnjiwD+ufj7P6NgnOPAnwM4L4SIu4iEKWzE1PKnAC4JIc7pHltIRANE9D+I6E/DGpgk3yiG4f5JFy7JAHhH9zfvIj4T018DeFn3/7icizh/5wAK4VsALQBOFh8yuraiigDwChG9TkRPFB9bIIR4HygYawDzQxudM76C0kV1nM6DFGzEJCGinxDRLw1+9CvkNSi9YN4HUC+EaAGwEcCzRDQ3yHHrsfkM/wigEUBzcdxPay8zeKtQY9Ay54KINgG4BWBf8aFInQsbIvedO4GIfg/ACwA2CCGuwvzaiiqtQoj/BcDnAXydiP4s7AG5gYhqADwK4EDxobidBylmhD2AuCCE+JzV80Q0A8BqAH+se81NADeLv79OROcB/CGAfh+HaordZ9Agoj0Aflz877sA7tY9/e8AvKd4aI6QOBdfBfAfAPy5KG76Ru1c2BC571wWIkqhYMD2CSEOAoAQ4pLuef21FUmEEO8V/71MRC+iEN69RESfEEK8X9z7uxzqIOX4PIBfaN9/3M6DLOyJqeNzAN4QQryrPUBEdxY3VkFEnwKwCMBbIY3PkuKNqfElAL8s/v4SgK8Q0UwiWojCZ/hZ0OOThYgeBvAtAI8KIW7oHo/NuUAhkWMRES0srqa/gsJ5iDTFPeH/CuDXQohdusfNrq3IQUSzi0kpIKLZAB5CYbwvAfhq8c++CuBfwxmhI0oiQ3E6D05gT0wd5bFnAPgzAN8jolsAJgB8TQhxJfCRyfF9ImpGIWx1EcDfAIAQ4gwR7QfwKxTCc1+PamZikf8CYCaAo4U5FSeEEF9DjM5FMbPyGwCOAEgC+CchxJmQhyVDK4C/BDBExTITAN8GsMbo2oooCwC8WLx2ZgB4VghxmIh+DmA/Ef0nAMMAHgtxjLYQ0SwUslv137XhPR53OMWeYRiGiS0cTmQYhmFiCxsxhmEYJrawEWMYhmFiCxsxhmEYJrawEWMYhmFiCxsxhmEYJrawEWMYhmFiCxsxhmEYJrb8//HQIWdttrW7AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "\n",
    "X_topics = svd_model.fit_transform(X)\n",
    "embedding = TSNE(n_components=2).fit_transform(X_topics)\n",
    "plt.figure(figsize=(7,5))\n",
    "plt.scatter(embedding[:, 0], embedding[:, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "artists_set = set(artists)\n",
    "works_set = set(repertory)\n",
    "cliques_set = set(cliques)\n",
    "vocations_set = set(vocations)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "words_of_texts = [i.split(' ') for i in clean_texts]\n",
    "classes = ['artists', 'repertory', 'cliques', 'vocations']\n",
    "\n",
    "artists_mentioned = []\n",
    "works_mentioned = []\n",
    "clique_mentioned = []\n",
    "vocation_mentoned = []\n",
    "\n",
    "for word_list in words_of_texts:\n",
    "    word_set = set(word_list)\n",
    "    artists_mentioned.append(list(word_set&artists_set))\n",
    "    works_mentioned.append(list(word_set&works_set))\n",
    "    clique_mentioned.append(list(word_set&cliques_set))\n",
    "    vocation_mentoned.append(list(word_set&vocations_set))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
